package com.wolfeyes.common.utils.character;

import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.regex.Pattern;

/**
* @see Talk is cheap, Show me the code. -- Linus Torvalds
* @title 字符串处理工具类，抽取一些常用操作
* @author yanyljava
* @create 2022-01-07 21:18
* @version 0.1
*/
public class StringUtil {

	/**
	 * @title 判断val是否不为空(null/"")
	 * @param val
	 * @return
	 */
	public static boolean isNotEmpty(String val){
		return val != null && !"".equals(val);
	}

	/**
	 * @title 将给定的驼峰命名值转换为下划线命名
	 * @param val
	 * @return
	 */
	public static String toUnderScoreCase(String val){
		if(!isNotEmpty(val)){
			return val;
		}
		StringBuilder sb = new StringBuilder(val);
		for(int i = 0; i < sb.length(); i++){
			if(sb.charAt(i) >= 'A' && sb.charAt(i) <= 'Z'){
				//将大写字母 "A" 替换为 "_a"
				sb.replace(i, i + 1, "_" + (char)(sb.charAt(i) + 32));
			}
		}
		return sb.toString();
	}


	/**
	 * @title 如果参数是null，返回""空字符串
	 * @param str 字符串
	 * @return 字符串
	 */
	public static String nullToSpace(String str) {
		if (str == null) {
			return "";
		} else {
			return str;
		}
	}

	/**
	 * @title 如果参数是null，返回默认参数指定的字符串
	 * @param str 字符串
	 * @param defaultString 默认参数指定的字符串
	 * @return 字符串
	 */
	public static String nullToDefault(String str, String defaultString) {
		if (str == null) {
			return defaultString;
		} else {
			return str;
		}
	}

	/**
	 * @title 判断参数是否是数字 ,支持正负数和小数
	 * @param str 要判断的字符串
	 * @return true/false
	 */
	public static boolean isNumeric(String str) {
		if (str == null) {
			return false;
		}
		return Pattern.matches("(-[1-9][0-9]*)|([0-9])|([1-9][0-9]+)|(((-?[0-9])|(-?[1-9][0-9]+))\\.[0-9]+)", str);
	}

	/**
	 * @title 将字符串转为int型数字，转换失败返回零
	 * @param str 字符串
	 * @return 数字
	 */
	public static int toInt(String str) {
		return toInt(str, 0);
	}

	/**
	 * @title 将字符串转为int型数字，可指定转换失败时的默认值
	 * @param str 字符串
	 * @param defaultInt 转换失败时的默认值
	 * @return 数字
	 */
	public static int toInt(String str, int defaultInt) {
		try {
			return Integer.parseInt(str);
		} catch (Exception e) {
			return defaultInt;
		}
	}

	/**
	 * @title 将字符串转为long型数字，转换失败返回零
	 * @param str 字符串
	 * @return 数字
	 */
	public static long toLong(String str) {
		return toLong(str, 0L);
	}

	/**
	 * @title 将字符串转为int型数字，可指定转换失败时的默认值
	 * @param str 字符串
	 * @param defaultLong 转换失败时的默认值
	 * @return 数字
	 */
	public static long toLong(String str, long defaultLong) {
		try {
			return Long.parseLong(str);
		} catch (Exception e) {
			return defaultLong;
		}
	}

	/**
	 * @title 将字符串转为double型数字，转换失败返回0.0
	 * @param str 字符串
	 * @return double型数字
	 */
	public static double toDouble(String str) {
		return toDouble(str, 0.0);
	}

	/**
	 * @title 将字符串转为double型数字，可指定转换失败时的默认值
	 * @param str 字符串
	 * @param defaultDouble 转换失败时的默认值
	 * @return double型数字
	 */
	public static double toDouble(String str, double defaultDouble) {
		try {
			return Double.parseDouble(str);
		} catch (Exception e) {
			return defaultDouble;
		}
	}

	/**
	 * @title 将字符串转为float型数字，转换失败返回0.0F
	 * @param str 字符串
	 * @return float型数字
	 */
	public static float toFloat(String str) {
		return toFloat(str, 0.0F);
	}

	/**
	 * @title 将字符串转为float型数字，可指定转换失败时的默认值
	 * @param str 字符串
	 * @param defaultFloat 转换失败时的默认值
	 * @return float型数字
	 */
	public static float toFloat(String str, float defaultFloat) {
		try {
			return Float.parseFloat(str);
		} catch (Exception e) {
			return defaultFloat;
		}
	}

	/**
	 * @title 获取当前时间，格式为参数指定格式
	 * @param pattern 时间格式。例如yyyy-MM-dd HH:mm:ss
	 * @return 当前时间或日期
	 */
	public static String getCurrent(String pattern) {
		try {
			return new SimpleDateFormat(pattern).format(new Date());
		} catch (Exception e) {
			return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
		}
	}

	/**
	 * @title 获得当前的日期 格式yyyy-MM-dd
	 * @return 当前的日期
	 */
	public static String getCurrentDate() {
		return getCurrent("yyyy-MM-dd");
	}

	/**
	 * @title 获得当前的时间 格式HH:mm:ss
	 * @return 当前的时间
	 */
	public static String getCurrentTime() {
		return getCurrent("HH:mm:ss");
	}

	/**
	 * @title 将小数格式化为百分数。如（输入为0.2353，则输出：23.53%)
	 * @param num 小数
	 * @param minDigit 最小保留小数位数
	 * @param maxDigit 最大保留小数位数
	 * @return 格式化后的字段串，带百分号
	 */
	public static String formatPercent(double num, int minDigit, int maxDigit) {
		NumberFormat percentFormatter = NumberFormat.getPercentInstance();
		percentFormatter.setMinimumFractionDigits(minDigit);
		percentFormatter.setMaximumFractionDigits(maxDigit);
		percentFormatter.setGroupingUsed(false);

		return percentFormatter.format(num);
	}


	/**
	 * @title 字节数组转为16进制字符串
	 * @param bytes 字节数组
	 * @return 大写的16进制字符串
	 */
	public static String byteToHexString(byte[] bytes) {
		String ret = null;
		if (bytes != null) {
			int i;
			StringBuffer strBuf = new StringBuffer("");
			for (int offset = 0; offset < bytes.length; offset++) {
				i = bytes[offset];
				if (i < 0)
					i += 256;
				if (i < 16)
					strBuf.append("0");
				strBuf.append(Integer.toHexString(i));
			}

			ret = strBuf.toString().toUpperCase();
		}
		return ret;
	}

	public static <T> String listToString(List<T> list) {
		String ret = null;
		if (list != null) {
			StringBuffer strBuf = new StringBuffer("");
			for (T t : list) {
				strBuf.append(t.toString().trim());
			}
			ret = strBuf.toString();
		}
		return ret;
	}

	public static String ArrayToString(String[] data, int start,int end,  String separator,boolean eachTrim) {
		String ret = null;
		if (data != null && start < end && start < data.length && end <= data.length) {
			StringBuffer strBuf = new StringBuffer("");
			for (int i = start; i< end;i++) {
				String str = data[i];
				if (!ParamUtils.isEmpty(str)) {
					if (eachTrim) {
						str = str.trim();
					}
					strBuf.append(str);
					if(separator!= null && i != end-1){
						strBuf.append(separator);
					}
				}
			}
			ret = strBuf.toString();
		}
		return ret;
	}
	
	public static String ArrayToString(String[] data, int start,String separator, boolean eachTrim) {
		if(data!= null){
			return ArrayToString(data,start,data.length,separator,eachTrim);
		}
		return null;
	}
	
	public static String ArrayToString(Object[] data,String separator, boolean eachTrim) {
		String ret = null;
		if (data != null) {
			StringBuffer strBuf = new StringBuffer("");
			for (int i = 0; i< data.length;i++) {
				Object str = data[i];
				if (!ParamUtils.isEmpty(str)) {
					if (eachTrim) {
						str = str.toString().trim();
					}
					strBuf.append(str);
					if(separator!= null && i != data.length-1){
						strBuf.append(separator);
					}
				}
			}
			ret = strBuf.toString();
		}
		return ret;
	}
	
	public static String ArrayToString(String[] data) {
		return ArrayToString(data,0,null,true);
	}

}


